package com.je.app.control;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;

import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

import com.je.app.model.Consumicion;
import com.je.app.model.EstadoHabitacion;
import com.je.app.model.Habitacion;
import com.je.app.model.Observacion;
import com.je.app.model.Periodo;
import com.je.app.model.TipoHabitacion;
import com.je.app.persistence.DaoHabitacion;
import com.je.app.persistence.DaoSesion;
import com.je.app.view.ConfiguracionHabitaciones;
import com.je.app.view.MainFrame;
import com.je.app.view.Observaciones;

public class ControlConfiguracion {

	private static ControlConfiguracion instance = new ControlConfiguracion();
	private HashMap<String, TipoHabitacion> hashTiposHabitaciones;
	private HashMap<String, Habitacion> hashHabitaciones;
	private HashMap<String, Consumicion> hashConsumiciones;


	public static ControlConfiguracion getInstance() {

		return instance;
	}

	private ControlConfiguracion() {

	}
	
	public void abrirConfiguraciones(){
		//buscar tipos habitaciones. 
		List <TipoHabitacion> listaTiposHabitaciones = DaoHabitacion.getInstance().list("TipoHabitacion");

		//crear un hashmap con el nombre del tipo y los periodos del tipo.
		HashMap<String, Object[][]> hashTiposHabitacionesParam = new HashMap <String,Object[][]> ();
		hashTiposHabitaciones = new HashMap <String,TipoHabitacion> ();
		for (TipoHabitacion tipoAux : listaTiposHabitaciones) {
			hashTiposHabitacionesParam.put(tipoAux.getNombre(),tipoAux.convertirPeriodosAMatriz());
			hashTiposHabitaciones.put(tipoAux.getNombre(), tipoAux);
		}
		
		//buscar habitaciones
		List <Habitacion> listaHabitaciones = DaoHabitacion.getInstance().list("Habitacion");
		hashHabitaciones = new HashMap <String,Habitacion> ();
		HashMap<String, String> hashHabitacionesParam = new HashMap <String,String> ();

		//crear matriz
		Object[][] matrizHabitacionesParametro = new Object[listaHabitaciones.size()][2];
		for (int i = 0 ; i < listaHabitaciones.size(); i++ ){
			hashHabitaciones.put(listaHabitaciones.get(i).getNombre(), listaHabitaciones.get(i));
			hashHabitacionesParam.put(listaHabitaciones.get(i).getNombre(), listaHabitaciones.get(i).getTipoHabitacion().getNombre());
			matrizHabitacionesParametro[i] = new Object[]{listaHabitaciones.get(i).getNombre(), listaHabitaciones.get(i).getTipoHabitacion().getNombre()};
		}

		//buscar habitaciones
		List <Consumicion> listaConsumiciones = DaoHabitacion.getInstance().list("Consumicion");
		hashConsumiciones = new HashMap <String,Consumicion> ();
		HashMap<String, String> hashConsumicionesParam = new HashMap <String,String> ();

		//crear matriz
		Object[][] matrizConsumicionesParametro = new Object[listaConsumiciones.size()][2];
		for (int i = 0 ; i < listaConsumiciones.size(); i++ ){
			hashConsumiciones.put(listaConsumiciones.get(i).getNombre(), listaConsumiciones.get(i));
			hashConsumicionesParam.put(listaConsumiciones.get(i).getNombre(), ""+listaConsumiciones.get(i).getPrecioUnitario());
			matrizConsumicionesParametro[i] = new Object[]{listaConsumiciones.get(i).getNombre(), listaConsumiciones.get(i).getPrecioUnitario()};
		}

		MainFrame.getInstance().setPanel(new ConfiguracionHabitaciones(null,hashTiposHabitacionesParam,matrizHabitacionesParametro, hashHabitacionesParam,matrizConsumicionesParametro, hashConsumicionesParam));
	}

	public void crearHabitaciones(HashMap <String,String> habitacionesNuevas){
		Iterator iterHabitacion = habitacionesNuevas.entrySet().iterator();
	    while (iterHabitacion.hasNext()) {
	    	Entry valores = (Entry) iterHabitacion.next();
	    	TipoHabitacion tipo = hashTiposHabitaciones.get(valores.getValue());
	    	DaoHabitacion.getInstance().save("Habitacion",new Habitacion(""+valores.getKey(),tipo, EstadoHabitacion.DISPONIBLE));
	    }

	}
	
	public List <String> modificarHabitaciones(HashMap <String,String> habitacionesModificadas){
		Iterator iterHabitacion = habitacionesModificadas.entrySet().iterator();
		List <String> noModificadas = new ArrayList <String> ();
	    while (iterHabitacion.hasNext()) {
	    	Entry valores = (Entry) iterHabitacion.next();
	    	Habitacion habActual = hashHabitaciones.get(valores.getKey());
	    	if(habActual.getEstado().equals(EstadoHabitacion.DISPONIBLE) || habActual.getEstado().equals(EstadoHabitacion.MANTENIMIENTO) 
	    			|| habActual.getEstado().equals(EstadoHabitacion.RESERVADO) )
	    	{
	    		habActual.setTipoHabitacion(hashTiposHabitaciones.get(valores.getValue()));
	    		DaoHabitacion.getInstance().persist(habActual);
	    	}
	    	else{
	    		noModificadas.add(habActual.getNombre());
	    	}
	    }
	    
	    return noModificadas;
	}
	
	public void crearConsumiciones(HashMap <String,String> consumicionesNuevas){
		Iterator<Entry<String, String>> iterConsumicion = consumicionesNuevas.entrySet().iterator();
	    while (iterConsumicion.hasNext()) {
	    	Entry valores = (Entry) iterConsumicion.next();
	    	double precio = new Double(""+valores.getValue());
	    	DaoHabitacion.getInstance().save("Consumicion",new Consumicion(""+valores.getKey(),precio,0,0));
	    }

	}
	
	public void modificarConsumiciones(HashMap <String,String> consumicionesModificadas){
		Iterator<Entry<String, String>> iterConsumicion = consumicionesModificadas.entrySet().iterator();

	    while (iterConsumicion.hasNext()) {
	    	Entry valores = (Entry) iterConsumicion.next();
	    	Consumicion consActual = hashConsumiciones.get(valores.getKey());
	   		consActual.setPrecioUnitario(new Double(""+valores.getValue()));
	   		DaoHabitacion.getInstance().persist(consActual);
	    }
	
	}
	
	public List <String> eliminarTiposHabitaciones(List <String> nombresTiposHabitaciones){
		List <String> listaTiposNoEliminados = new ArrayList<String>();
		
		//para cada nombreTipo buscar el tipo
		for(String tipoAux: nombresTiposHabitaciones){
			//corroborar que el tipo no tenga habitaciones	
			if(DaoHabitacion.getInstance().permiteEliminar(tipoAux)){
				//si no tiene, eliminar
				TipoHabitacion tipo = hashTiposHabitaciones.get(tipoAux);
				DaoHabitacion.getInstance().remove(tipo);
			}
			else{
				//si tiene, meter en una lista de tipos no eliminadas
				listaTiposNoEliminados.add(tipoAux);
			}
		}
		
		return listaTiposNoEliminados;
		
	}
	
	public void crearTiposHabitaciones(HashMap<String,TableModel> configuracionesPeriodos){
		//Para cada nombreTipo busca el table model.
		
		for(String nombreTipo : configuracionesPeriodos.keySet()){
			DefaultTableModel model = ((DefaultTableModel) configuracionesPeriodos.get(nombreTipo));
			int cantidadFilas = model.getRowCount();
			List <Periodo> periodos = new ArrayList <Periodo> ();
			for(int i = 0 ; i < cantidadFilas ; i++){
				String fechaInicio = (String) model.getValueAt(i, 0);
				String fechaFin = (String) model.getValueAt(i, 1);
				double precio = new Double(""+model.getValueAt(i, 2));
				int minutos = new Integer(""+model.getValueAt(i, 3));
				Periodo periodo = new Periodo(fechaInicio,fechaFin,precio,minutos);
				periodos.add(periodo);
			}
			DaoHabitacion.getInstance().save("TipoHabitacion", new TipoHabitacion(nombreTipo,periodos));
		}
		//Para cada fila del table model crea un periodo.
		//Crea el tipoHabitacion
		
	}
	
	public void modificarTiposHabitaciones(HashMap<String,TableModel> configuracionesPeriodos){
		//Para cada nombreTipo busca el table model. 
		//Para cada fila del table model crea un periodo.
		//Modificar el tipoHabitacion
		
		for(String nombreTipo : configuracionesPeriodos.keySet()){
			TipoHabitacion habActual = hashTiposHabitaciones.get(nombreTipo);
			DefaultTableModel model = ((DefaultTableModel) configuracionesPeriodos.get(nombreTipo));
			int cantidadFilas = model.getRowCount();
			List <Periodo> periodos = new ArrayList <Periodo> ();
			for(int i = 0 ; i < cantidadFilas ; i++){
				String fechaInicio = (String) model.getValueAt(i, 0);
				String fechaFin = (String) model.getValueAt(i, 1);
				double precio = new Double(""+model.getValueAt(i, 2));
				int minutos = new Integer(""+model.getValueAt(i, 3));
				Periodo periodo = new Periodo(fechaInicio,fechaFin,precio,minutos);
				periodos.add(periodo);
			}
			habActual.setPeriodos(periodos);
			DaoHabitacion.getInstance().persist(habActual);
		}
		
	}

	public void abrirObservaciones() {
		List <Habitacion> habitaciones = DaoHabitacion.getInstance().list("Habitacion");
		Object[][] matrizNombres = new Object[habitaciones.size()][1];
		int i = 0;
		for(Habitacion hab : habitaciones){
			matrizNombres[i]=new Object[]{hab.getNombre()};
			i++;
		}
		
		MainFrame.getInstance().setPanel(new Observaciones(matrizNombres));
	}

	public void eliminarObservacion(int id) {
		DaoSesion.getInstance().remove(DaoSesion.getInstance().get(Observacion.class, id));
		
	}

}
